home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / string / strtod.c < prev    next >
C/C++ Source or Header  |  1994-08-19  |  2KB  |  114 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *  Portions Copyright (C) 1994 Rafael W. Luebbert
  5.  *
  6.  *  This library is free software; you can redistribute it and/or
  7.  *  modify it under the terms of the GNU Library General Public
  8.  *  License as published by the Free Software Foundation; either
  9.  *  version 2 of the License, or (at your option) any later version.
  10.  *
  11.  *  This library is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  *  Library General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU Library General Public
  17.  *  License along with this library; if not, write to the Free
  18.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  *  $Id: strtod.c,v 1.2 1994/07/08 16:26:11 rluebbert Exp $
  21.  *
  22.  *  $Log: strtod.c,v $
  23.  * Revision 1.2  1994/07/08  16:26:11  rluebbert
  24.  * Added NULL definition
  25.  *
  26.  * Revision 1.1  1994/07/08  16:23:54  rluebbert
  27.  * Initial revision
  28.  *
  29.  */
  30.  
  31. #ifndef NULL
  32. #define NULL    0
  33. #endif
  34.  
  35. extern double atof();
  36.  
  37. double
  38. strtod (s, ptr)
  39. register char *s;
  40. register char **ptr;
  41. {
  42.     double ret = 0.0;
  43.     char *start = s;
  44.     char *begin = NULL;
  45.     int success = 0;
  46.  
  47.     /* optional white space */
  48.     while (isspace(*s))
  49.         s++;
  50.  
  51.     /* optional sign */
  52.     if (*s == '+' || *s == '-') {
  53.         s++;
  54.         if (*(s-1) == '-')
  55.             begin = s - 1;
  56.         else
  57.             begin = s;
  58.     }
  59.  
  60.     /* string of digits with optional decimal point */
  61.     if (isdigit(*s) && ! begin)
  62.         begin = s;
  63.  
  64.     while (isdigit(*s)) {
  65.         s++;
  66.         success++;
  67.     }
  68.  
  69.     if (*s == '.') {
  70.         if (! begin)
  71.             begin = s;
  72.         s++;
  73.         while (isdigit(*s))
  74.             s++;
  75.         success++;
  76.     }
  77.  
  78.     if (s == start || success == 0)        /* nothing there */
  79.         goto out;
  80.  
  81.     /*
  82.       *    optional 'e' or 'E'
  83.      *        followed by optional sign or space
  84.      *        followed by an integer
  85.      */
  86.  
  87.     if (*s == 'e' || *s == 'E') {
  88.         s++;
  89.  
  90.         /* XXX - atof probably doesn't allow spaces here */
  91.         while (isspace(*s))
  92.             s++;
  93.  
  94.         if (*s == '+' || *s == '-')
  95.             s++;
  96.  
  97.         while (isdigit(*s))
  98.             s++;
  99.     }
  100.  
  101.     /* go for it */
  102.     ret = atof(begin);
  103.  
  104. out:
  105.     if (! success)
  106.         s = start;    /* in case all we did was skip whitespace */
  107.  
  108.     if (ptr)
  109.         *ptr = s;
  110.  
  111.     return ret;
  112. }
  113.  
  114.